package org.example.Redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author : fangcong
 * @date : 2023/3/22 15:22
 * @description : 类作用
 **/
public class RedisDemo1 {

    /**
     * redis是一个单线程的服务，那么所有的命令肯定会排队被redis执行，redis提供的命令都是原子性的，百度搜索incr\decr就是说将对应的key+1，key-1的值重新set到redis中，
     * 而且很多都是认为incr\decr原子性的，那么现在就有一个问题，如果redis的key:a, value:100,那么100个线程并发执行decr操作，那么对应的key的value是不是应该为0？
     */
    //https://blog.csdn.net/qq_38240227/article/details/129712818
    private static JedisPool jedisPool;

    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20000);
        jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1", 6379);
        jedisPool.getResource().set("testNumber", ""+2024);
    }

    public static void main(String[] args) {
        int number = 2024;
        for(int i = 0; i < number ; i++){
            System.out.println(i);
            Thread thread  = new Thread(() -> {
                Jedis currentJedis = jedisPool.getResource();
                //每个线程 减去1
                currentJedis.decrBy("testNumber", 1);
            });
            thread.start();
        }
		// sleep堵塞等到所有的子线程执行完成。
		  try {
            Thread.sleep(60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }	
        Jedis jedis = jedisPool.getResource();
        String testNumber = jedis.get("testNumber");
        System.out.println(testNumber);
    }

}
